<?php

class CandidatoMapper extends SON_Db_DataMapperAbstract
{
    protected $_dbTable = "DbTable_Candidato";
    protected $_model = "Candidato";

    protected function _insert(SON_Db_DomainObjectAbstract $obj)
    {
        try {
            $dbTable = $this->getDbTable();
            $data = array(
                'foto' => $obj->getFoto(),
                'sequencial' => $obj->getSequencial(),
                'numero' => $obj->getNumero(),
                'nome' => $obj->getNome(),
                'eleicao_id' => $obj->getEleicao_id(),
                'cargo_id' => $obj->getCargo_id(),
                'partido_id' => $obj->getPartido_id(),
                'politico_id' => $obj->getPolitico_id(),
            	'coligacao_id' => $obj->getColigacao_id(),
            	'estado_id' => $obj->getEstado_id(),
            	'cidade_id' => $obj->getCidade_id(),
            	'situacao_id' => $obj->getSituacao_id(),
                'resultado_id' => $obj->getResultado_id()
            );
            return $dbTable->insert(array_filter($data));
        } catch (Zend_Exception $e) {
            throw new Exception($e);
        }
    }

    protected function _update(SON_Db_DomainObjectAbstract $obj)
    {
    	try {
            $dbTable = $this->getDbTable();
            $data = array(
            	'foto' => $obj->getFoto(),
            	'sequencial' => $obj->getSequencial(),
            	'numero' => $obj->getNumero(),
            	'nome' => $obj->getNome(),
            	'eleicao_id' => $obj->getEleicao_id(),
            	'cargo_id' => $obj->getCargo_id(),
            	'partido_id' => $obj->getPartido_id(),
            	'politico_id' => $obj->getPolitico_id(),
            	'coligacao_id' => $obj->getColigacao_id(),
            	'estado_id' => $obj->getEstado_id(),
            	'cidade_id' => $obj->getCidade_id(),
            	'situacao_id' => $obj->getSituacao_id(),
            	'resultado_id' => $obj->getResultado_id()
            );
            $data = array_map(function($value) { return (!is_null($value) && empty($value)) ? new Zend_Db_Expr('NULL') : $value; }, $data);
            $dbTable->update(array_filter($data), array('id = ?' => $obj->getId()));
            return true;
        } catch (Zend_Exception $e) {
            throw new Exception($e);
        }
    }
    
    public function search(array $params = null)
    {
        $page = isset($params['page']) ? (int) $params['page'] : 1;
        $conditions = isset($params['conditions']) ? $params['conditions'] : null;
        $perPage = isset($params['perpage']) ? (int) $params['perpage'] : 20;
        $limit = ( $page - 1 ) * $perPage;
        $select = $this->getDb()->select();
        
        $select->from(
        			'candidato',
        			array(
        				'id',
        				'foto',
        				'sequencial',
        				'numero',
        				'nome',
        				'ue' => "IF(!ISNULL(estado.id), estado.nome, IF(!ISNULL(cidade.id), CONCAT_WS(' - ', cidade.nome, uf.sigla), 'BR'))"
        			)
        		)
                ->join('eleicao', 'eleicao.id = candidato.eleicao_id', array('eleicao' => 'ano'))
                ->join('cargo', 'cargo.id = candidato.cargo_id', array('cargo' => 'descricao'))
                ->join('partido', 'partido.id = candidato.partido_id', array('partido' => 'sigla'))
                ->joinLeft('coligacao', 'coligacao.id = candidato.coligacao_id', array('coligacao' => 'nome'))
                ->joinLeft('estado', 'estado.id = candidato.estado_id', array('estado' => 'nome'))
                ->joinLeft('cidade', 'cidade.id = candidato.cidade_id', array('cidade' => 'nome', 'municipio' => 'codigo'))
                ->joinLeft(array('uf' => 'estado'), 'uf.id = cidade.estado_id', array('sigla'))
                ->join('situacao', 'situacao.id = candidato.situacao_id', array('situacao' => 'descricao'))
                ->join('resultado', 'resultado.id = candidato.resultado_id', array('resultado' => 'descricao'))
                ->order(array('eleicao DESC', 'cargo', 'ue', 'nome'));
    
        if (is_array($conditions)) {
            foreach ($conditions as $key => $condition) {
                $select->where($key, $condition);
            }
        }
    
        if (!is_null($limit) || $limit != 0)
            $select->limit($perPage, $limit);
        
        $paginator = Zend_Paginator::factory($select);
        $paginator->setCurrentPageNumber($page);
        $paginator->setItemCountPerPage($perPage);
    
        return $paginator;
    }
    
    public function find($id)
    {
    	$db = $this->getDb();
    	$query = $db->select();
    	$query->from('candidato')
    		->where('id = ' . (int) $id);
    
    	$data = $db->fetchRow($query);
    
    	if ($data) {
    		$eleicao = new Eleicao();
    		$releicao = $eleicao->find($data['eleicao_id']);
    		$data['eleicao_id'] = $releicao;
    		
    		$cargo = new Cargo();
    		$rcargo = $cargo->find($data['cargo_id']);
    		$data['cargo_id'] = $rcargo;
    		
    		$partido = new Partido();
    		$rpartido = $partido->find($data['partido_id']);
    		$data['partido_id'] = $rpartido;
    		
    		$estado = new Estado();
    		$restado = $estado->find($data['estado_id']);
    		$data['estado_id'] = $restado;
    		
    		$cidade = new Cidade();
    		$rcidade = $cidade->find($data['cidade_id']);
    		$data['cidade_id'] = $rcidade;
    		
    		$situacao = new Situacao();
    		$rsituacao = $situacao->find($data['situacao_id']);
    		$data['situacao_id'] = $rsituacao;
    		
    		$resultado = new Resultado();
    		$rresultado = $resultado->find($data['resultado_id']);
    		$data['resultado_id'] = $rresultado;
    		
    		return $this->_populate($data);
    	}
    }
    
    public function getCandidatos(array $conditions = null)
    {
    	$db = $this->getDb();
    	$query = $db->select();
    	$query->from('candidato', array('id', 'sequencial', 'ue' => "IF(!ISNULL(estado.id), estado.sigla, IF(!ISNULL(cidade.id), cidade.codigo, 'BR'))"))
	    	  ->join('eleicao', 'eleicao.id = candidato.eleicao_id', array('eleicao' => 'ano'))
	    	  ->joinLeft('estado', 'estado.id = candidato.estado_id', array())
	    	  ->joinLeft('cidade', 'cidade.id = candidato.cidade_id', array())
	    	  ->joinLeft(array('uf' => 'estado'), 'uf.id = cidade.estado_id', array());
    	
    	if (!is_null($conditions)) {
	    	foreach ($conditions as $key => $condition) {
	    		$query->where($key, $condition);
	    	}
    	}
    
    	return $db->fetchAll($query);
    }
    
    public function findBySequencial($sequencial, $ue, $eleicao_id)
    {
    	$db = $this->getDb();
    	$query = $db->select();
    	$query->from('candidato')
	    	->joinLeft('estado', 'estado.id = candidato.estado_id', array())
	    	->joinLeft('cidade', 'cidade.id = candidato.cidade_id', array())
    		->where('sequencial = ?', $sequencial)
    		->where("IF(!ISNULL(estado.id), estado.sigla, IF(!ISNULL(cidade.id), cidade.codigo, 'BR')) = ?", $ue)
    		->where('eleicao_id = ?', $eleicao_id);
    
    	$data = $db->fetchRow($query);
    	if ($data) {
    		return $this->_populate($data);
    	}
    }
}

